<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>[2.18]-定制化：资源服务的再实现 | PhalApi(π框架) - PHP轻量级开源接口框架 - 接口，从简单开始！</title>
    <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
    <meta content="yes" name="apple-mobile-web-app-capable">
    <meta content="black" name="apple-mobile-web-app-status-bar-style">
    <meta content="telephone=no" name="format-detection">
    <meta content="email=no" name="format-detection">
    <meta name="Author" content="PhalApi,ecitlm,dogstar">
    <meta name="description" content="PhalApi 1.x 旧版开发文档，[2.18]-定制化：资源服务的再实现，推荐新项目使用 2.x 新版本。" >
    <meta name="keywords" content="PhalApi,phalapi,phalapi接口开发,后台接口开发,后台接口开发框架,接口开发,接口框架,开源接口框架,PHP后台接口开发,PHP接口开发,PHP接口框架,PHP后台接口框架,phalapi官网,PHP接口框架,php接口开发框架,php接口开发,php web框架,π框架,π开发框架,π接口框架,π接口开发框架,api接口,php接口,phpapi,,PHP接口框架,phalapi文档,phalapi wiki,PhalApi文档,phalapi在线文档,phalapi官方文档">

    <link rel="stylesheet" type="text/css" href="/css/bootstrap.min.css" media="screen" /> 
    <link rel="icon" href="/images/yesyesapi_20190622221710_a8b7dc50a446b2fb281b6a956bb7f005.png" type="image/x-icon" /> 
    <link rel="stylesheet" href="../css/main.css" />
    <link rel="stylesheet" href="../css/loading_bar.css" />
    <script src="../js/pace.min.js"></script>
	
	<!-- 代码高亮 -->
	<link rel="stylesheet" href="../css/highlight.min.css">
	<script src="../js/highlight.min.js"></script>
	<script>hljs.initHighlightingOnLoad();</script>
    
    
</head>

<body>
    <!-- navbar start -->
    <div class="navbar navbar-default navbar-fixed-top" id="mainnav" role="navigation">
        <div class="container">
            <div class="navbar-header">
                <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target=".navbar-collapse">
                    <span class="sr-only">Toggle navigation</span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                <a class="navbar-brand website_name" href="/"><!-- <span>PhalApi</span> --><strong></strong></a>
            </div>
            <div class="navbar-collapse collapse" aria-expanded="false" style="height: 1px;">
                <ul class="nav navbar-nav navbar-right" id="nav_bar">
                    <li><a href="https://www.phalapi.net/">首页</a></li>

                    <li><a href="https://www.phalapi.net/download.html">下载</a></li>
                    <li class="active"><a href="https://www.phalapi.net/wikis/">1.x 文档</a></li>
                    <li><a href="http://docs.phalapi.net/#/v2.0/" target="_blank">2.x 文档</a></li>

                    <li ><a href="https://www.phalapi.net/book">书籍</a></li>
                    <li><a href="https://www.phalapi.net/wikis/8-1.html" >视频</a></li>
                    <li><a href="https://www.phalapi.net/donate.html">捐赠</a></li>
                    <li><a href="http://pro.phalapi.net/" target="_blank">Pro专业版</a></li>
                    <li><a href="http://demo.phalapi.net/docs.php" target="_blank">体验</a></li>
                </ul>
            </div>
            <!--/.nav-collapse -->
        </div>
    </div>
    <!-- navbar end -->


    <div id="content">
        <div class="container">

            

            <div class="row row-md-flex row-md-flex-wrap">
                
                <h4><a href="/wikis/%5B2.17%5D-%E5%BE%AE%E6%9C%8D%E5%8A%A1%EF%BC%9AApi%E6%8E%A5%E5%8F%A3%E6%9C%8D%E5%8A%A1%E5%B1%82.html">上一章</a>   <a href="/wikis/">文档首页</a>   <a href="/wikis/%5B2.19%5D-%E6%89%A9%E5%B1%95%E5%BA%93%EF%BC%9A%E5%8F%AF%E9%87%8D%E7%94%A8%E7%9A%84%E6%89%A9%E5%B1%95%E7%B1%BB%E5%BA%93.html">下一章</a></h4>
<hr />
<p><em>美到极致不是无可增加，而是无可减少。  -- Antonie de Saint-Exupery</em></p>
<h2>2.18.1 资源服务</h2>
<p>资源可以理解成接口开发过程中所使用到的第三方系统、功能，如数据库，COOKIE、缓存；而服务则是指领域驱动设计中无状态的服务操作，如加密、过滤器、加载器等。<br />
而在PhalApi中，资源和服务更多是通过DI来统一进行管理。并且我们使用资源服务来统称这两者。  </p>
<p>在使用PhalApi进行开发时，应该分别从以下三个层面来使用资源服务。</p>
<ul>
<li>1、基本使用</li>
<li>2、高级应用</li>
<li>3、定制扩展</li>
</ul>
<p>其中，基本使用是指使用框架默认提供的特性、功能，只需要稍微修改调整一下配置（甚至连配置都不需要修改）即可使用；
高级应用是指切换使用具有同类特性、功能的资源服务，对客户端而言，其实现的功能是等价的，只在于内部实现不同，通常此层面适用于有不同需求的应用场景；
最后是，定制扩展则是充满活力、生气的做法，对于项目需要用到而框架未提供的，都可以通过此方式进行定制、扩展。</p>
<h2>2.18.2 仍然以缓存为例</h2>
<p>下面以大家熟悉的缓存为例，分别说明这三个层面的演进使用。  </p>
<h3>(1)基本使用</h3>
<p>在./Public/init.php初始化文件中，我们可以去掉对Memcache的注释，从而在项目启用cache这一资源服务。</p>
<pre><code class="language-php">//缓存 - Memcache/Memcached
DI()-&gt;cache = function () {
    return new PhalApi_Cache_Memcache(DI()-&gt;config-&gt;get('sys.mc'));
};</code></pre>
<p>或者，我们还需要根据配置的MC不同，稍微更改一下./Config/sys.php中对应的配置：</p>
<pre><code class="language-php">    /**
     * MC缓存服务器参考配置
     */
     'mc' =&gt; array(
           'host' =&gt; '127.0.0.1',
           'port' =&gt; 11211,
     ),</code></pre>
<p>然后，就可以在项目中如前面说的那样使用cache进行对缓存进行操作。</p>
<pre><code class="language-php">//设置缓存
DI()-&gt;cache-&gt;set($key, $value, $expireTime);

//读取缓存
$rs = DI()-&gt;cache-&gt;get($key);</code></pre>
<h3>(2)高级应用</h3>
<p>但是我们都知道，缓存的实现方案以及存储的方式多种多样，包括但不限于：数据库缓存、文件缓存、COOKIE/session缓存、Redis缓存、APC缓存。  </p>
<p>假设我们需要切换到Redis缓存，则可以在init.php初始化中，把DI()-&gt;cache注册成Redis缓存即可。</p>
<pre><code class="language-php">DI()-&gt;cache = function () {
    return new PhalApi_Cache_Redis(DI()-&gt;config-&gt;get('sys.redis'));
};</code></pre>
<p>同时，在./Config/sys.php中添加对应的配置：</p>
<pre><code class="language-php">     'redis' =&gt; array(
           'host' =&gt; '127.0.0.1',
           'port' =&gt; 9527,
     ),</code></pre>
<h3>(3)定制扩展</h3>
<p>毫无疑义，实际项目需要面对的开发场景更为复杂，可能需要使用到加密、压缩、分片或者其他处理手段，又可能使用其他存储媒介。  </p>
<p>当框架基本的特性无法满足时，这时就需要考虑进行定制扩展了。值得庆幸的是，实现这一点并不难。一如往常那样，我们需要 <strong>先实现、再注册</strong> 。   </p>
<h4>实现资源服务接口</h4>
<p>很多通常的资源服务，我们都统一了接口规约。在[1.19]-DI服务速查：各资源服务一览表 中可以查到每个资源服务所需要实现的接口。  </p>
<p>如这次的缓存接口类是：</p>
<pre><code class="language-php">&lt;?php

interface PhalApi_Cache {

    /**
     * 设置缓存
     * 
     * @param string $key 缓存key
     * @param mixed $value 缓存的内容
     * @param int $expire 缓存有效时间，单位秒，非时间戳
     */
    public function set($key, $value, $expire = 600);

    /**
     * 读取缓存
     * 
     * @param string $key 缓存key
     * @return mixed 失败情况下返回NULL
     */
    public function get($key);

    /**
     * 删除缓存
     * 
     * @param string $key
     */
    public function delete($key);
}</code></pre>
<p>我们可以先在项目中，实现此接口，如：</p>
<pre><code class="language-php">class Common_MyCache implements PhalApi_Cache {
     // ... ...
}</code></pre>
<p>具体的实现，这里不再举例。  </p>
<h4>再注册</h4>
<p>当实现好子类后，我们便可以在init.php初始化文件中，切换到我们自己的定制类。</p>
<pre><code class="language-php">DI()-&gt;cache = 'Common_MyCache';</code></pre>
<h2>2.18.3 实现、定制化你的资源服务</h2>
<p>正如《项目百态》书中隐藏的美模式一节中写道的“恰恰相反，只有减少特性才能提升设计的美感。最好的设计都是功能明确又留有答题，也是易于测试的，即使要作修改，也不会带来新的麻烦。”  </p>
<p>是以，作为一个框架，我们应当以发散的方式去设计；但为了能为应用提供可用的功能，我们又应当以收敛的方式去实现。如果我们提供的功能不足以满足大部分主流的业务场景，那么我们至少需要提供可扩展的空间。  </p>
<p>类似的场景，还包括有接口签名、对接口参数的获取与接口结果的返回。当大家在进行项目开发过程中，有不同的场景需求时，可以按上面介绍的三个层面分别进行。    </p>
<p>先尝试使用简单、默认的方式进行配置解决，再切换到框架或已有的解决方案，最后再尝试扩展自己的定制类。</p>
<hr />
<h4><a href="/wikis/%5B2.17%5D-%E5%BE%AE%E6%9C%8D%E5%8A%A1%EF%BC%9AApi%E6%8E%A5%E5%8F%A3%E6%9C%8D%E5%8A%A1%E5%B1%82.html">上一章</a>   <a href="/wikis/">文档首页</a>   <a href="/wikis/%5B2.19%5D-%E6%89%A9%E5%B1%95%E5%BA%93%EF%BC%9A%E5%8F%AF%E9%87%8D%E7%94%A8%E7%9A%84%E6%89%A9%E5%B1%95%E7%B1%BB%E5%BA%93.html">下一章</a></h4><div style="float: left">
<h4>
<a href="http://qa.phalapi.net/">还有疑问？欢迎到社区提问！</a>
&nbsp;&nbsp;
<a href="http://docs.phalapi.net/#/v2.0/">切换到PhalApi 2.x 开发文档。</a>
</h4>
</div>
            </div>
        </div>
    </div>

 
        <!-- footer -->
        <div class="footer">
            <div class="link container ">
                <div class=" col-xs-7 col-sm-7 col-md-7 col-lg-7 ">
                    <h3>PhalApi (π框架)</h3>
                    <p>一个轻量级PHP开源接口框架，专注于接口服务开发，支持HTTP/SOAP/RPC协议，拥有自动生成的在线文档、多种开发语言的客户端SDK包以及可重用的扩展类库，可用于快速搭建微服务、RESTful接口或Web
                        Services。</p>
                    <!-- <p>:</p> -->
                    <a href="https://www.phalapi.net/" target="_blank"> PhalApi </a>
                    <span>|</span>
                    <!--
                    <a href="http://qa.phalapi.net/" target="_blank">社区</a>
                    <span>|</span>
                    -->
                    <a href="https://www.phalapi.net/download.html" target="_blank">下载</a>
                    <span>|</span>
                    <a href="https://www.phalapi.net/wikis/">1.x 文档</a>
                    <span>|</span>
                    <a href="http://docs.phalapi.net/#/v2.0/">2.x 新文档</a>
                    <span>|</span>
                    <a href="http://www.ituring.com.cn/book/2405" target="_blank">书籍</a>
                    <span>|</span>
                    <a href="http://demo.phalapi.net/" target="_blank">体验</a>
                    <span>|</span>
                    <a href="https://www.phalapi.net/donate.html" target="_blank">捐赠</a>
                    <span>|</span>
                    <a href="https://github.com/phalapi/phalapi-library" target="_blank">扩展</a>
                    <span>|</span>
                    <a href="https://www.phalapi.net/license.html" target="_blank">许可</a>
                    <span>|</span>
                    <a href="https://www.phalapi.net/about.html" target="_blank">关于</a>
                    <span>|</span>
                    <a href="https://www.phalapi.net/wikis/en/" target="_blank">English</a>

                </div>
                <div class=" col-xs-5 col-sm-5 col-md-5 col-lg-5 contact_us ">
                    <h3>联系我们</h3>
                    <a href="https://github.com/phalapi/phalapi"><img src="../images/github.png" alt="github" /></a>
                    <a href="http://weibo.com/p/100808d236e99beb645bfb56ed1c37dde9b8bd?k=phalapi%E5%BC%80%E6%BA%90%E6%A1%86%E6%9E%B6&from=501&_from_=huati_topic"><img src="../images/weibo.png"  alt="weibo" /></a>
                    <a href="https://www.phalapi.net/images/alipay.png"><img src="../images/zfb.png"  alt="zfb" /></a>
					<a target="_blank" href="//shang.qq.com/wpa/qunwpa?idkey=f16292029e59975d4ccfccc70ed87aa5c5646df512e83b0e9e1270e8368be461"><img border="0" src="../images/qq.png" alt="π框架 - PhalApi交流群②" title="π框架 - PhalApi交流群②"></a>
                    <a href="http://git.oschina.net/dogstar/PhalApi"><img src="../images/git-oschina.png"  alt="git-oschina" /></a>
                </div>
                <div class="cls"></div>
                <div class="text-center copy_right"> ©2015-2024 PhalApi All Rights Reserved. <a href="http://www.miitbeian.gov.cn" target="_blank">粤ICP备15028808号</a>

				<script type="text/javascript">var cnzz_protocol = (("https:" == document.location.protocol) ? " https://" : " http://");document.write(unescape("%3Cspan id='cnzz_stat_icon_1255326144'%3E%3C/span%3E%3Cscript src='" + cnzz_protocol + "s4.cnzz.com/z_stat.php%3Fid%3D1255326144%26show%3Dpic' type='text/javascript'%3E%3C/script%3E"));</script>
                </div>
            </div>
        </div>
    </div>


    <a href="https://github.com/phalapi"><img id="gitHub_fllow" style="position: fixed; top: 0; right: 0; border: 0;z-index:9999" src="https://camo.githubusercontent.com/652c5b9acfaddf3a9c326fa6bde407b87f7be0f4/68747470733a2f2f73332e616d617a6f6e6177732e636f6d2f6769746875622f726962626f6e732f666f726b6d655f72696768745f6f72616e67655f6666373630302e706e67" alt="Fork me on GitHub" data-canonical-src="https://s3.amazonaws.com/github/ribbons/forkme_right_orange_ff7600.png"></a>


    <script src="../js/jquery-1.11.1.min.js"></script>
    <script src="../js/bootstrap.min.js"></script>
</body>

<script>
var _hmt = _hmt || [];
(function() {
  var hm = document.createElement("script");
  hm.src = "https://hm.baidu.com/hm.js?bbd0e84d1a1464f844d594adc1610100";
  var s = document.getElementsByTagName("script")[0]; 
  s.parentNode.insertBefore(hm, s);
})();
</script>




</html>
